//
//  Helper.h
//  Source
//
//  Created by Toj on 5/11/22.
//

// MARK: - 1. 去掉 Find Implicit Dependencies.
/*
Product > Scheme > Edit Scheme > Build
Build Opitions选项中，去掉Find Implicit Dependencies.

原理：
选中Find Implicit Dependencies时，编译以下内容：
* 项目所有的文件
* 被修改的frameworks文件

未选中Find Implicit Dependencies时，编译以下内容：
* 项目中必要的文件
* 不会重新编译frameworks文件，即时你对其中的文件做了修改
*/

// MARK: - 2. 编译时长优化 Architectures
/*
在Build Settings中，有个Architectures配置选项
Architectures
是指定工程支持的指令集的集合，如果设置多个architecture，则生成的二进制包会包含多个指令集代码，提及会随之变大。

Valid Architectures
有效的指令集集合，Architectures与Valid Architectures的交集来确定最终的数据包含的指令集代码。

Build Active Architecture Only
指定是否只对当前连接设备所支持的指令集编译，
默认Debug的时候设置为YES，Release的时候设为NO。
Debug设置为YES时只编译当前的architecture版本，生成的包只包含当前连接设备的指令集代码；设置为NO时，则生成的包包含所有的指令集代码（上述的V艾力达Architecture与Architecture的交集）。
所以为了更快的编译速度，Debug应设为YES，而Release应设为NO。
 
NOTE: Debug设置为YES时，如果连接的设备是arm64的（iPhone 5s，iPhone 6（plus）等），
则Valid Architecture中必须包含arm64，否则编译会出错。这种模式下编译出来的版本是向下
兼容的，即：编译出的armv6版本可在armv7版本上运行。
*/

// MARK: - 3. 编译时长优化 Precompile Prefix Header 预编译头文件
/*
Build Setting > Apple LLVM 7.1 - Language
Xcode 6及之后版本默认不使用pch文件参与项目编译，原因有二：
* 去掉自动导入的系统框架类库的头文件们可以提高源文件的复用性，便于迁移；
* 一个庞大的Prefix Header会增加Build耗时。

但对于原有项目应用了pch文件的情况，就需要对Xcode的Build Setting进行配置以使用pch。

当Precompile Prefix Header设为NO时，头文件pch不会被预编译，而是在每个用到它导入的框架类库中编译一次。每个引用了pch内容的.m文件都要编译一次pch，这会降低项目的编译速度。

将Precompile Prefix Header设为YES时，pch文件会被预编译，预编译后的pch会被缓存起来，从而提高编译速度。
需要编译的pch文件在Prefix Header中注册即可。
*/

// MARK: - 4. 编译时长优化 Swift Compile - Code Generation Optimization Level
/*
Build Setting > Swift Compile - Code Generation > Optimization Level
Debug None[-Onone] Release Fast[-O] 是Xcode在Debug模式下编译Swift项目的最优选项，通过测试可以看出，
在默认配置情况下和自定义情况下的编译耗时存在比较明显的差异。
*/

// MARK: - 5. 安装包大小优化 Flatten Compiles XIB Files
/*
Build Setting > Interface Builder XIB Compiler - Options > Flatten Compiled XIB Files
是否扁平化编译XIB文件
官方解释是：指定是否在编译时剥离nib文件以优化它们的大小，设为YES时编译出来的nib文件会被压缩但是不能编辑
*/

// MARK: - 6. 安装包大小优化 清理未被使用的图片资源LSUnusedResources
/*
工具原理:
app启动加载不同文件下的资源名称格式
选择文件夹 读取全部文件内的资源 & 读取代码文件内容过滤出指定的文件名
遍历资源文件是否在文件名中出现,
最后得到的就是未使用过的

NOTE:
缺陷服务器端返回的文件名可能被删除
*/

// MARK: - 7. 安装包大小优化 Deployment Postprocessing和Strip Linked Product
Xcode中Strip Linked Product 的默认设置为YES，但是Deployment Postprocessing的默认设置为NO。
在Deployment Postprocessing 是Deployment的总开关，所以在打开这个选项之前 Strip Linked Product是不起作用

// MARK: - 8. 安装包大小优化 Linking->Dead Code Stripping
将Dead Code Stripping 设置为YES 也能够一定程度上对程序安装包进行优化，
只是优化的效果一般，对于一些比较小的项目甚至没有什么优化体现，所以这里也就没有上测试数据。

Dead Code Stripping 是对程序编译出的可执行二进制文件中没有被实际使用的代码进行Strip操作。
